package com.ruoyi.dmpdatacollect.service.impl;

import java.util.List;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.dmp.common.util.DmpDateTimeUtil;
import com.ruoyi.dmp.common.util.DmpStringUtil;
import com.ruoyi.dmpdatacollect.domain.DmpDcollectTaskPartvaluegen;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.dmpdatacollect.domain.DmpDcollectTaskVariablegen;
import com.ruoyi.dmpdatacollect.mapper.DmpDcollectTaskMapper;
import com.ruoyi.dmpdatacollect.domain.DmpDcollectTask;
import com.ruoyi.dmpdatacollect.service.IDmpDcollectTaskService;

/**
 * 数据采集任务Service业务层处理
 * 
 * @author MquanZeng
 * @date 2021-12-17
 */
@Service
public class DmpDcollectTaskServiceImpl implements IDmpDcollectTaskService 
{
    @Autowired
    private DmpDcollectTaskMapper dmpDcollectTaskMapper;

    /**
     * 查询数据采集任务
     * 
     * @param taskId 数据采集任务主键
     * @return 数据采集任务
     */
    @Override
    public DmpDcollectTask selectDmpDcollectTaskByTaskId(Integer taskId)
    {
        return dmpDcollectTaskMapper.selectDmpDcollectTaskByTaskId(taskId);
    }

    /**
     * 查询数据采集任务列表
     * 
     * @param dmpDcollectTask 数据采集任务
     * @return 数据采集任务
     */
    @Override
    public List<DmpDcollectTask> selectDmpDcollectTaskList(DmpDcollectTask dmpDcollectTask)
    {
        return dmpDcollectTaskMapper.selectDmpDcollectTaskList(dmpDcollectTask);
    }

    /**
     * 新增数据采集任务
     * 
     * @param dmpDcollectTask 数据采集任务
     * @return 结果
     */
    @Transactional
    @Override
    public AjaxResult insertDmpDcollectTask(DmpDcollectTask dmpDcollectTask) {
        int rows = -1;
        try{
            String chectResult = checkDtFormat(dmpDcollectTask);
            if(chectResult.length()>0){
                return AjaxResult.success(chectResult, rows);
            }
            dmpDcollectTask.setCreateTime(DateUtils.getNowDate());
            rows = dmpDcollectTaskMapper.insertDmpDcollectTask(dmpDcollectTask);
            // 变量值生成策略 插入
            insertDmpDcollectTaskVariablegen(dmpDcollectTask);
            // 分区生成策略 插入
            insertDmpDcollectTaskPartvaluegen(dmpDcollectTask);

            return AjaxResult.success(rows);
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.success("操作失败，请联系管理员", rows);
        }
    }

    /**
     * 修改数据采集任务
     * 
     * @param dmpDcollectTask 数据采集任务
     * @return 结果
     */
    @Transactional
    @Override
    public AjaxResult updateDmpDcollectTask(DmpDcollectTask dmpDcollectTask) {
        int rows = -1;
        try{
            String chectResult = checkDtFormat(dmpDcollectTask);
            if(chectResult.length()>0){
                return AjaxResult.success(chectResult, rows);
            }
            dmpDcollectTask.setUpdateTime(DateUtils.getNowDate());
            // 变量值生成策略 先删再插入
            dmpDcollectTaskMapper.deleteDmpDcollectTaskVariablegenByTaskId(dmpDcollectTask.getTaskId());
            insertDmpDcollectTaskVariablegen(dmpDcollectTask);
            // 分区生成策略 先删再插入
            dmpDcollectTaskMapper.deleteDmpDcollectTaskPartvaluegenByTaskId(dmpDcollectTask.getTaskId());
            insertDmpDcollectTaskPartvaluegen(dmpDcollectTask);

            rows = dmpDcollectTaskMapper.updateDmpDcollectTask(dmpDcollectTask);
            return AjaxResult.success(rows);
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.success("操作失败，请联系管理员", rows);
        }
    }

    /**
     * 检查日期时间格式是否合法
     *
     * @param dmpDcollectTask
     * @return
     */
    private static String checkDtFormat(DmpDcollectTask dmpDcollectTask){
        List<DmpDcollectTaskVariablegen> variableList = dmpDcollectTask.getDmpDcollectTaskVariablegenList();
        for(DmpDcollectTaskVariablegen variable : variableList){
            if("datetime".equalsIgnoreCase(variable.getVarGentype()) && !DmpDateTimeUtil.isLegalOfFormat(variable.getDatetimeVarformat())){
                return "源数据查询语句-变量生成策略信息 变量值 " + variable.getVariable() + " 的日期时间格式 " + variable.getDatetimeVarformat() + " 不合法，请修改!!";
            }
        }

        List<DmpDcollectTaskPartvaluegen> partvaluegenList = dmpDcollectTask.getDmpDcollectTaskPartvaluegenList();
        for(DmpDcollectTaskPartvaluegen partvalue:partvaluegenList){
            if("datetime".equalsIgnoreCase(partvalue.getPartvalGentype()) && !DmpDateTimeUtil.isLegalOfFormat(partvalue.getDatetimeFormat())){
                return "分区值生成策略信息 分区字段 " + partvalue.getPartfield() + " 的日期时间格式 " + partvalue.getDatetimeFormat() + " 不合法，请修改!!";
            }
        }
        return "";
    }



    /**
     * 批量删除数据采集任务
     * 
     * @param taskIds 需要删除的数据采集任务主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteDmpDcollectTaskByTaskIds(Integer[] taskIds)
    {
        // 变量值生成策略 删除
        dmpDcollectTaskMapper.deleteDmpDcollectTaskVariablegenByTaskIds(taskIds);
        // 分区生成策略 删除
        dmpDcollectTaskMapper.deleteDmpDcollectTaskPartvaluegenByTaskIds(taskIds);

        return dmpDcollectTaskMapper.deleteDmpDcollectTaskByTaskIds(taskIds);
    }

    /**
     * 删除数据采集任务信息
     * 
     * @param taskId 数据采集任务主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteDmpDcollectTaskByTaskId(Integer taskId)
    {
        // 变量值生成策略 删除
        dmpDcollectTaskMapper.deleteDmpDcollectTaskVariablegenByTaskId(taskId);
        // 分区生成策略 删除
        dmpDcollectTaskMapper.deleteDmpDcollectTaskPartvaluegenByTaskId(taskId);

        return dmpDcollectTaskMapper.deleteDmpDcollectTaskByTaskId(taskId);
    }

    /**
     * 新增源数据查询语句-变量生成策略信息
     * 
     * @param dmpDcollectTask 数据采集任务对象
     */
    public void insertDmpDcollectTaskVariablegen(DmpDcollectTask dmpDcollectTask)
    {
        List<DmpDcollectTaskVariablegen> dmpDcollectTaskVariablegenList = dmpDcollectTask.getDmpDcollectTaskVariablegenList();
        Integer taskId = dmpDcollectTask.getTaskId();
        if (StringUtils.isNotNull(dmpDcollectTaskVariablegenList))
        {
            List<DmpDcollectTaskVariablegen> list = new ArrayList<DmpDcollectTaskVariablegen>();
            for (DmpDcollectTaskVariablegen dmpDcollectTaskVariablegen : dmpDcollectTaskVariablegenList)
            {
                dmpDcollectTaskVariablegen.setTaskId(taskId);
                list.add(dmpDcollectTaskVariablegen);
            }
            if (list.size() > 0)
            {
                dmpDcollectTaskMapper.batchDmpDcollectTaskVariablegen(list);
            }
        }
    }

    /**
     * 新增分区值生成策略信息
     *
     * @param dmpDcollectTask 数据采集任务对象
     */
    public void insertDmpDcollectTaskPartvaluegen(DmpDcollectTask dmpDcollectTask)
    {
        List<DmpDcollectTaskPartvaluegen> dmpDcollectTaskPartvaluegenList = dmpDcollectTask.getDmpDcollectTaskPartvaluegenList();
        Integer taskId = dmpDcollectTask.getTaskId();
        if (StringUtils.isNotNull(dmpDcollectTaskPartvaluegenList))
        {
            List<DmpDcollectTaskPartvaluegen> list = new ArrayList<DmpDcollectTaskPartvaluegen>();
            for (DmpDcollectTaskPartvaluegen dmpDcollectTaskPartvaluegen : dmpDcollectTaskPartvaluegenList)
            {
                dmpDcollectTaskPartvaluegen.setTaskId(taskId);
                list.add(dmpDcollectTaskPartvaluegen);
            }
            if (list.size() > 0)
            {
                dmpDcollectTaskMapper.batchDmpDcollectTaskPartvaluegen(list);
            }
        }
    }



    /**
     * 复制数据采集任务信息
     *
     * @param taskId 数据采集任务主键
     * @return 结果
     */
    @Transactional
    @Override
    public AjaxResult copyTask(Integer taskId)
    {
        try{
            // 获取原任务信息
            DmpDcollectTask oldTask = dmpDcollectTaskMapper.selectDmpDcollectTaskByTaskId(taskId);
            oldTask.setTaskName("copy_"+oldTask.getTaskName());// 任务名称修改一下
            // 插入新的任务
            insertDmpDcollectTask(oldTask);
        }catch(Exception e){
            String isDuplicateName = DmpStringUtil.subMiddleString(e.getMessage(), "Duplicate entry '", "' for key 'idx_u_task_name'");
            if(isDuplicateName.length()>0){
                return AjaxResult.error(isDuplicateName+" 任务名称已存在!!");
            }
            e.printStackTrace();
            return AjaxResult.error("执行出错，请联系管理员！");
        }
        return AjaxResult.success();
    }

}
